package com.xjm.i1.core.context;

import cn.hutool.core.io.FileUtil;
import com.xjm.i1.Exceptions.AreaTypeNotFoundException;
import com.xjm.i1.constant.AreaEnum;
import com.xjm.i1.constant.DataTypeEnum;
import com.xjm.i1.core.struct.node.load.I1AreaCollections;
import com.xjm.i1.utils.StrUtils;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Slf4j
public class MetaDataLoader {

    /**
     * 根据读取的所有行数据进行空格去除(格式化)，返回二维数组
     * @param readLines 行数据
     * @param initRow 初始化行
     * @param initColum 初始化列
     * @return 二维数组
     * */
    public Double[][] loadMetaData(List<String> readLines, int initRow, int initColum) {

        boolean isBegin = false;
        List<Double[]> metaTmpData = new ArrayList(initRow);

        for (Iterator<String> iter = readLines.iterator(); iter.hasNext(); ) {
            String it = iter.next();
            if (isBegin && !SignEnum.END.sign.equals(it)) {
                metaTmpData.add(StrUtils.splitBlankToArray(it, initColum));
            }
            if (isBegin && SignEnum.END.sign.equals(it)) {
                break;
            }
            if (!isBegin && SignEnum.START.sign.equals(it)) {
                isBegin = true;
            }
        }

        int x = metaTmpData.size();
        int y = metaTmpData.get(0).length;
        return metaTmpData.toArray(new Double[x][y]);
    }

    /**
     * 根据文件路径 调用 {@linkplain MetaDataLoader#loadMetaData(List, int, int)} 加载数据并解析构建为区域对象
     * @param file 文件
     * @return I1一张页面中的某个区域数据
     * */
    public I1AreaCollections load(File file) throws AreaTypeNotFoundException {
        List<String> readLines = FileUtil.readLines(file, StandardCharsets.UTF_8);

        String fileName = FileUtil.getPrefix(file);
        DataTypeEnum dataTypeEnum = DataTypeEnum.checkDataType(fileName);
        if (dataTypeEnum == null) {
            throw new AreaTypeNotFoundException(String.format("根据 arg[0]参数[filePath] 无法找到对应的Area范围类型, " +
                    "文件名称请根据以下范围重命名后重试 %s, 错误[filepath]: %s", AreaEnum.getVals().toString(), file.getAbsolutePath()));
        }

        Double[][] metaData = loadMetaData(readLines, dataTypeEnum.getRow(), dataTypeEnum.getColumn());

        AreaEnum areaEnum = AreaEnum.checkAreaType(fileName);
        return ApplicationContextHolder.getMetaDataResolveAdapter().resolve(metaData, areaEnum);
    }

    /**
     * 根据文件路径 调用 {@linkplain MetaDataLoader#loadMetaData(List, int, int)} 加载数据并解析构建为区域对象
     * @param filePath 文件路径
     * @return I1一张页面中的某个区域数据
     * */
    public I1AreaCollections load(String filePath) throws AreaTypeNotFoundException {
        File file = new File(filePath);
        return load(file);
    }
    
    enum SignEnum{
        START("BEGIN_DATA"), END("END_DATA");
        private String sign;
        SignEnum(String sign) {
            this.sign = sign;
        }
    }
}
